/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._205;


import java.util.HashMap;
import java.util.Map;

/**
 *
 * 给定两个字符串 s 和 t，判断它们是否是同构的。
 *
 * 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
 *
 * 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。
 *
 * 示例 1:
 *
 * 输入: s = "egg", t = "add"
 * 输出: true
 * 示例 2:
 *
 * 输入: s = "foo", t = "bar"
 * 输出: false
 * 示例 3:
 *
 * 输入: s = "paper", t = "title"
 * 输出: true
 * 说明:
 * 你可以假设 s 和 t 具有相同的长度。
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._205
 * @ClassName: IsomorphicStrings
 * @Author: linyaonan
 * @Date: 2019/12/6 11:29
 */
public class IsomorphicStrings {

    public boolean isIsomorphic(String s, String t) {

        Map<Character, Integer> sMap = new HashMap<>();
        Map<Character, Integer> tMap = new HashMap<>();


        char[] sChars = s.toCharArray();
        char[] tChars = t.toCharArray();
        for (int i = 0; i < sChars.length; i++) {
            char sChar = sChars[i];
            Integer sInt = sMap.get(sChar);
            if (sInt == null) {
                char tChar = tChars[i];
                Integer tInt = tMap.get(tChar);
                if (tInt != null) {
                    return false;
                } else {
                    sMap.put(sChar, i);
                    tMap.put(tChar, i);
                }
            } else {
                char tChar = tChars[i];
                Integer tInt = tMap.get(tChar);
                if (!sInt.equals(tInt)) {
                    return false;
                }
            }
        }
        return true;
    }


    /**
     * 输入：s = "paper", t = "title"
     * 输出：true
     * @param s
     * @param t
     * @return
     */
    public boolean check(String s, String t) {
        if (s.length() == 1 && t.length() == 1) {
            return true;
        }

        HashMap<Character, Integer> m1 = new HashMap<>();
        HashMap<Character, Integer> m2 = new HashMap<>();

        char[] c1 = s.toCharArray();
        char[] c2 = t.toCharArray();

        for (int i = 0; i < c1.length; i++) {
            char cc1 = c1[i];
            char cc2 = c2[i];
            if (!m1.containsKey(cc1)) {
                if (!m2.containsKey(cc2)) {
                    m1.put(cc1, i);
                    m2.put(cc2, i);
                    continue;
                } else {
                    return false;
                }
            } else {
                if (m2.containsKey(cc2)) {
                    if (m2.get(cc2).equals(m1.get(cc1))) {
                        continue;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        }
        return true;

    }

}
